﻿/*************************************************************************************
 * 工    具：  HK_MakeGroup
 * 
 * 描    述：  HK_MakeGroup 打组工具，借鉴 `Maya` 中的打组功能，用于将选中的多个 `Unity` 物体对象（`GameObjects`）打组操作。生成一个新的父对象，
 *            将所有选中的对象作为该新父对象的子对象，并将新父对象在层次视图中位置与第一个选中物体保持一致。具体使用方式如下：

 *            **选择物体:** 在 `Hierarchy` 面板中，选中需要打组的多个物体（`GameObjects`）。
 *            **执行打组操作：**在 `HKTools` 菜单下，选择 `MakeGroup(打组工具)`，或按下快捷键 `Ctrl + G` 或 `Cmd + G`。
 *            **查看结果：**此时会创建一个名为 `Parent_Go` 的新父对象，并按照预期层次结构和位置将选中的对象作为其子对象。
 * 
 * 版    本：  V1.1
 * 作    者：  京产肠饭
 * 
 * 创    建：  2021/08/25  V1.0
 * 
 * 更    新：  2024/10/06  V1.1
 *            1.优化激活方式，移除代码中对 HK_GlobalSetting 的依赖
 * 
 * 链    接：  https://gitee.com/JingChanChangFan/hk_-unity-tools
*************************************************************************************/

using UnityEditor;
using UnityEngine;

namespace HKTools
{
    [InitializeOnLoad]
    public class HK_MakeGroup
    {
        public static void ChangeState(bool isActive)
        {
            IsActive = isActive;
        }

        // 是否激活
        static bool IsActive;

        [MenuItem("HKTools/Make Group (打组工具) %g", validate = true, priority = HK_MenuPriority.HK_MakeGroup)]
        static bool MakeGroupValidate()
        {
            return IsActive;
        }

        [MenuItem("HKTools/Make Group (打组工具) %g", priority = HK_MenuPriority.HK_MakeGroup)]
        public static void MakeGroup()
        {
            var selectedObjs = Selection.gameObjects;

            if (selectedObjs.Length == 0)
            {
                Debug.LogError("HK_MakeGroup: 未选中物体，无法执行打组操作!");
                return;
            }

            GameObject go;

            if (selectedObjs[0].GetComponent<RectTransform>() != null)
            {
                go = new GameObject("Parent_Go", typeof(RectTransform));
            }
            else
            {
                go = new GameObject("Parent_Go");
            }

            // 保持一致的层次结构
            go.transform.SetParent(selectedObjs[0].transform.parent, false);
            go.transform.SetSiblingIndex(selectedObjs[0].transform.GetSiblingIndex()); // 设置层级与第一个选中物体保持一致

            Undo.RegisterCreatedObjectUndo(go, "CreateParent");

            Vector3 pos = Vector3.zero;

            foreach (var item in selectedObjs)
            {
                pos += item.transform.position;
            }

            pos = pos / selectedObjs.Length;

            go.transform.position = pos;

            foreach (var item in selectedObjs)
            {
                Undo.SetTransformParent(item.transform, go.transform, "SetParent");
            }

            Selection.activeGameObject = go;
        }
    }
}